package Formularios;

import java.awt.BorderLayout;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.*;
import java.text.DecimalFormat;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import org.eclipse.wb.swing.FocusTraversalOnArray;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import java.awt.CardLayout;
import javax.swing.SwingConstants;
import javax.swing.JDesktopPane;
import javax.swing.JTextArea;
import javax.swing.border.BevelBorder;
import javax.swing.border.MatteBorder;
import java.awt.Color;
import javax.swing.border.SoftBevelBorder;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;




public class frmProductos extends JDialog {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField txtCodigo;
	private JTextField txtDescripcion;
	String sUnidadMedida = "Kg.";
	
	//NEMONICOS
	static final int COL_COD_REACTIVO = 0;
	static final int COL_DESCRIPCION = 1;
	static final int COL_PRECIO_KILO = 2;
	static final int COL_GRAMOS = 3;
	static final int COL_COSTO = 4;
	//teclas Virtuales
	static final int VK_SALTO_DE_LINEA = 10;
	static final int VK_F5 = 116;
	static final int VK_F7 = 118;
	static final int VK_SUPR = 127;
	
	static Statement comando;
	static Connection con;
	private JTextField txtStockMin;
	private JTextField txtExistencia;
	private JPanel buttonPane;
	private JButton okButton;
	private JButton cancelButton;
	private JTable table;
	private JTextField txtPrecioCostoProducto;
	private JTextField txtUtilidad;
	private JTextField txtPrecioVenta;
	private JLabel lblCodReactivo;
	private JTextField txtCodReactivo;
	private JLabel lblPrecioXKilo;
	private JTextField txtPrecioKilo;
	private JLabel lblNecGramos;
	private JTextField txtGramos;
	private String sDescripcion;
	final JComboBox cbUnidadMedida = new JComboBox();
	JTextArea txaFormulacion;
	
	private int iRenglon = 0;
	private StatusBar sbMensaje;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try
		{
			JFrame.setDefaultLookAndFeelDecorated(true);
			JDialog.setDefaultLookAndFeelDecorated(true);
			//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
			//UIManager.setLookAndFeel("napkin.NapkinLookAndFeel");
			//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
			LookAndFeelInfo[] lista = UIManager.getInstalledLookAndFeels();
		}
		catch (Exception e)
		{
		 	e.printStackTrace();
		}
		
		try {
			
			general gen = new general();
			comando = gen.abrirConexion(cNemonicos.IP_GLOBAL,1);
			{
				frmProductos dialog = new frmProductos();
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
				dialog.setVisible(true);
				dialog.setLocationByPlatform(true); //centrar dialogo
				
				System.out.println("aqui va algo" + comando.getConnection());
				System.out.println("ya salio del dialogo");
			}
			
						
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the dialog.
	 */
	public frmProductos() {
		setTitle("Captura de Productos");		

		general gen = new general();
		try {
			comando = gen.abrirConexion(cNemonicos.IP_GLOBAL,1);
		} catch (ClassNotFoundException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		} catch (SQLException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosed(WindowEvent arg0) {
				//Cerramos la conexión
				try {
					comando.execute("END");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				try {
					comando.close();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		setBounds(100, 100, 797, 469);
		// Centrar
		setLocationRelativeTo(null);
		
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		
		JLabel lblCodigo = new JLabel("Codigo:");
		
		txtCodigo = new JTextField();
		txtCodigo.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {

				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					if ( txtCodigo.getText().length() > 0)
					{
						if ( consultarProducto(Integer.parseInt(txtCodigo.getText())) == false)
						{
							//seleccionar la selda txtCodigo
							limpiarCampos();
						}
					}
					else
					{
						txtCodigo.setText(String.valueOf(general.consultarFolio(comando, cNemonicos.FOLIO_PRODUCTOS, cNemonicos.SIGUIENTE_SECUENCIA)));
						txtDescripcion.requestFocus();
					}
				}
				
			}
			@Override
			public void keyTyped(KeyEvent e) {
				//si es un numero permite pasar, si no lo rechaza
				if (!general.esValidoNum(e.getKeyChar()) == true)
				{
					e.consume();
				}
				if (txtCodigo.getText().length() == 3) {
					e.consume();
				}
			}
		});		
		txtCodigo.setColumns(10);
		
		JLabel lblDescripcion = new JLabel("Nombre :");
		txtDescripcion = new JTextField();
		txtDescripcion.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					cbUnidadMedida.requestFocus();
				}
				if ( arg0.getKeyCode() == VK_SUPR )
				{
					int op = JOptionPane.showOptionDialog (null,"Desea eliminar el producto Actual ","Eliminar Producto",JOptionPane.YES_NO_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR","CANCELAR"},"ACEPTAR");
					if ( op == 0)
					{
						eliminarProducto(Integer.parseInt(txtCodigo.getText()));
					}
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				if (txtDescripcion.getText().length() == 30) {
					e.consume();
				}
			}
		});
		txtDescripcion.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtDescripcion.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar un Nombre","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtDescripcion.requestFocus();
					return false;
				}
				
			}
		});
		txtDescripcion.setColumns(10);
		
		JLabel lblUnidadM = new JLabel("Unidad M.");
		
		JLabel lblStock = new JLabel("Stock :");
		
		JLabel lblExistencia = new JLabel("Existencia :");
		
		txtStockMin = new JTextField();
		txtStockMin.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if ( e.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					txtExistencia.requestFocus();
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				if (!general.esValidoNum(e.getKeyChar()) == true)
				{
					e.consume();
				}
				if (txtStockMin.getText().length() == 3) {
					e.consume();
				}
			}
		});
		txtStockMin.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtStockMin.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar el Stock","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtStockMin.requestFocus();
					return false;
				}
				
			}
		});
		txtStockMin.setColumns(10);
		
		txtExistencia = new JTextField();
		txtExistencia.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					txtCodReactivo.requestFocus();
				}
					
			}
			@Override
			public void keyTyped(KeyEvent e) {
				if (!general.esValidoNum(e.getKeyChar()) == true)
				{
					e.consume();
				}
				if (txtExistencia.getText().length() == 3) {
					e.consume();
				}
			}
		});
		txtExistencia.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtExistencia.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar la Existencia","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtExistencia.requestFocus();
					return false;
				}
				
			}
		});
		txtExistencia.setColumns(10);
		
		JScrollPane scrollPane = new JScrollPane();
		
		JLabel lblPrecioCostoProducto = new JLabel("Precio Costo Producto:");
		
		txtPrecioCostoProducto = new JTextField();
		txtPrecioCostoProducto.setEditable(false);
		txtPrecioCostoProducto.setColumns(10);
		
		JLabel lblUtilidad = new JLabel("Utilidad %:");

		txtUtilidad = new JTextField();
		txtUtilidad.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
				sbMensaje.setText("[ ENTER ] Continuar ");
			}
		});
		txtUtilidad.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA && txtUtilidad.getText().length() > 0 )
				{
					String sCostoProducto = txtPrecioCostoProducto.getText();
					sCostoProducto = sCostoProducto.replace(",", ".");
					double dCostoProducto = Double.parseDouble(sCostoProducto);
					int iUtilidad = Integer.parseInt(txtUtilidad.getText());
					double dPrecioVenta = dCostoProducto  + (dCostoProducto * iUtilidad / 100);
					DecimalFormat df = new DecimalFormat("0.000");
					txtPrecioVenta.setText(df.format((dPrecioVenta)));
					txtPrecioVenta.requestFocus();
					sbMensaje.setText("[ Enter ] Confirmar Precio y Grabar");
					txtPrecioVenta.setSelectionStart(0);
					txtPrecioVenta.setSelectionEnd(txtPrecioVenta.getText().length());
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				if (!general.esValidoNum(e.getKeyChar()) == true)
				{
					e.consume();
				}
				if (txtExistencia.getText().length() == 3) {
					e.consume();
				}
			}
		});
		txtUtilidad.setInputVerifier(new InputVerifier() {
			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txtUtilidad.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar la utilidad","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txtUtilidad.requestFocus();
					return false;
				}
				
			}
		});
		txtUtilidad.setColumns(10);
		
		JLabel lblPrecioVenta = new JLabel("Precio Venta:");
		
		txtPrecioVenta = new JTextField();
		txtPrecioVenta.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					if ( guardar() == true)
					{
						sbMensaje.setText("Producto Guardado Con Exito");
						limpiarCampos();
						sbMensaje.setText("[ ESC ] Limpiar, [ ENTER ] Continuar");
					}
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				if (!general.esValidoNum(e.getKeyChar()) == true)
				{
					e.consume();
				}
				if (txtPrecioVenta.getText().length() == 7) {
					e.consume();
				}
			}
		});
		
		txtPrecioVenta.setColumns(10);
		
		lblCodReactivo = new JLabel("Cod. Reactivo:");
		
		txtCodReactivo = new JTextField();
		txtCodReactivo.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				
				if ( arg0.getKeyCode() == VK_F7)
				{
					txaFormulacion.setText("");
					txaFormulacion.requestFocus();
				}
				
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA && txtCodReactivo.getText().length() > 0 )
				{
					boolean bResultado = conslutarReactivo(Integer.parseInt(txtCodReactivo.getText()));
					if (bResultado == false)
					{
						int op = JOptionPane.showOptionDialog (null,"Reactivo no existe ","Entrada Invalidad",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
						txtCodReactivo.requestFocus();
						txtCodReactivo.setSelectionStart(0);
						txtCodReactivo.setSelectionEnd(txtCodReactivo.getText().length());
					}
					else
					{
						txtGramos.requestFocus();
					}
				}
				else
				{
					getToolkit().beep();
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				if (!general.esValidoNum(e.getKeyChar()) == true)
				{
					e.consume();
				}
				if (txtCodReactivo.getText().length() == 3) {
					e.consume();
				}
			}
		});
		txtCodReactivo.setColumns(10);
		
		lblPrecioXKilo = new JLabel("Precio X Kilo:");
		
		txtPrecioKilo = new JTextField();
		txtPrecioKilo.setEditable(false);
		txtPrecioKilo.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if ( e.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					txtGramos.requestFocus();
				}
			}
		});
		txtPrecioKilo.setColumns(10);
		lblNecGramos = new JLabel("Nec. Gramos:");
		
		txtGramos = new JTextField();
		txtGramos.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if ( e.getKeyCode() == VK_SALTO_DE_LINEA && txtGramos.getText().length() > 0 )
				{
					double dPrecioxKilo = Double.parseDouble(txtPrecioKilo.getText());
					double dPrecioxGramo = dPrecioxKilo / 1000;
					int iNecGramos = Integer.parseInt(txtGramos.getText());
					double dCosto = dPrecioxGramo *  iNecGramos;


					table.setValueAt(Integer.parseInt(txtCodReactivo.getText()), iRenglon, COL_COD_REACTIVO);
					table.setValueAt(sDescripcion, iRenglon, COL_DESCRIPCION);
					table.setValueAt(Double.parseDouble(txtPrecioKilo.getText()), iRenglon, COL_PRECIO_KILO);
					table.setValueAt(Integer.parseInt(txtGramos.getText()), iRenglon, COL_GRAMOS);
					table.setValueAt(dCosto, iRenglon, COL_COSTO);
					Double dCostoProducto =  calcularCostoProducto();
					DecimalFormat df = new DecimalFormat("0.000");
					txtPrecioCostoProducto.setText(df.format((dCostoProducto)));
					iRenglon++;
					limpiarCamposReactivos();
					sbMensaje.setText("[ F7 ] Capturar Formulación");
					txtCodReactivo.requestFocus();
					
				}
			}
			@Override
			public void keyTyped(KeyEvent e) {
				if (!general.esValidoNum(e.getKeyChar()) == true)
				{
					e.consume();
				}
				if (txtGramos.getText().length() == 4) {
					e.consume();
				}
			}
		});
		txtGramos.setColumns(10);

		cbUnidadMedida.setModel(new DefaultComboBoxModel(new String[] {"Kg.", "Lt."}));		
		cbUnidadMedida.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == VK_SALTO_DE_LINEA )
				{
					sUnidadMedida = (String) cbUnidadMedida.getSelectedItem();
					txtStockMin.requestFocus();										
				}
			}
		});
		
		JDesktopPane desktopPane = new JDesktopPane();
		
		JScrollPane scrollPane_1 = new JScrollPane();
		GroupLayout gl_contentPanel = new GroupLayout(contentPanel);
		gl_contentPanel.setHorizontalGroup(
			gl_contentPanel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPanel.createSequentialGroup()
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPanel.createSequentialGroup()
							.addGap(50)
							.addGroup(gl_contentPanel.createParallelGroup(Alignment.TRAILING)
								.addComponent(lblStock)
								.addComponent(lblDescripcion)
								.addComponent(lblCodigo))
							.addGap(12)
							.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
								.addGroup(gl_contentPanel.createSequentialGroup()
									.addPreferredGap(ComponentPlacement.RELATED)
									.addComponent(txtDescripcion, GroupLayout.PREFERRED_SIZE, 158, GroupLayout.PREFERRED_SIZE)
									.addGap(18)
									.addComponent(lblUnidadM)
									.addPreferredGap(ComponentPlacement.UNRELATED)
									.addComponent(cbUnidadMedida, GroupLayout.PREFERRED_SIZE, 68, GroupLayout.PREFERRED_SIZE))
								.addGroup(gl_contentPanel.createSequentialGroup()
									.addComponent(txtStockMin, GroupLayout.PREFERRED_SIZE, 41, GroupLayout.PREFERRED_SIZE)
									.addPreferredGap(ComponentPlacement.UNRELATED)
									.addComponent(lblExistencia)
									.addPreferredGap(ComponentPlacement.RELATED)
									.addComponent(txtExistencia, GroupLayout.PREFERRED_SIZE, 38, GroupLayout.PREFERRED_SIZE))
								.addComponent(txtCodigo, GroupLayout.PREFERRED_SIZE, 67, GroupLayout.PREFERRED_SIZE)))
						.addGroup(gl_contentPanel.createSequentialGroup()
							.addContainerGap()
							.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
								.addGroup(gl_contentPanel.createSequentialGroup()
									.addComponent(scrollPane_1, GroupLayout.PREFERRED_SIZE, 479, GroupLayout.PREFERRED_SIZE)
									.addPreferredGap(ComponentPlacement.RELATED)
									.addComponent(desktopPane, GroupLayout.PREFERRED_SIZE, 1, GroupLayout.PREFERRED_SIZE))
								.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 733, GroupLayout.PREFERRED_SIZE))))
					.addContainerGap(40, Short.MAX_VALUE))
				.addGroup(gl_contentPanel.createSequentialGroup()
					.addContainerGap(527, Short.MAX_VALUE)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.TRAILING)
						.addComponent(lblPrecioVenta)
						.addComponent(lblUtilidad)
						.addComponent(lblPrecioCostoProducto))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING, false)
						.addComponent(txtUtilidad, GroupLayout.PREFERRED_SIZE, 40, GroupLayout.PREFERRED_SIZE)
						.addComponent(txtPrecioCostoProducto, GroupLayout.DEFAULT_SIZE, 72, Short.MAX_VALUE)
						.addComponent(txtPrecioVenta, 0, 0, Short.MAX_VALUE))
					.addContainerGap())
				.addGroup(gl_contentPanel.createSequentialGroup()
					.addContainerGap()
					.addComponent(lblCodReactivo)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(txtCodReactivo, GroupLayout.PREFERRED_SIZE, 48, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(lblPrecioXKilo)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(txtPrecioKilo, GroupLayout.PREFERRED_SIZE, 57, GroupLayout.PREFERRED_SIZE)
					.addGap(18)
					.addComponent(lblNecGramos)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(txtGramos, GroupLayout.PREFERRED_SIZE, 49, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(260, Short.MAX_VALUE))
		);
		gl_contentPanel.setVerticalGroup(
			gl_contentPanel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPanel.createSequentialGroup()
					.addContainerGap()
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
						.addComponent(txtCodigo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(lblCodigo))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
						.addComponent(lblDescripcion)
						.addComponent(txtDescripcion, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(lblUnidadM)
						.addComponent(cbUnidadMedida, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
						.addComponent(lblStock)
						.addComponent(txtStockMin, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(lblExistencia)
						.addComponent(txtExistencia, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(26)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
						.addComponent(lblCodReactivo)
						.addComponent(txtCodReactivo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(lblPrecioXKilo)
						.addComponent(txtPrecioKilo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(lblNecGramos)
						.addComponent(txtGramos, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 126, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(gl_contentPanel.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPanel.createSequentialGroup()
							.addComponent(desktopPane, GroupLayout.PREFERRED_SIZE, 1, GroupLayout.PREFERRED_SIZE)
							.addGap(5)
							.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
								.addComponent(txtPrecioCostoProducto, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
								.addComponent(lblPrecioCostoProducto))
							.addPreferredGap(ComponentPlacement.RELATED)
							.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
								.addComponent(txtUtilidad, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
								.addComponent(lblUtilidad))
							.addPreferredGap(ComponentPlacement.RELATED)
							.addGroup(gl_contentPanel.createParallelGroup(Alignment.BASELINE)
								.addComponent(lblPrecioVenta)
								.addComponent(txtPrecioVenta, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
						.addComponent(scrollPane_1, GroupLayout.DEFAULT_SIZE, 102, Short.MAX_VALUE))
					.addContainerGap())
		);
		
		txaFormulacion = new JTextArea();
		txaFormulacion.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent arg0) {
				sbMensaje.setText("[ F7 ] Capturar Utilidad");
			}
		});
		
		txaFormulacion.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				if ( arg0.getKeyCode() == cNemonicos.VK_F7 )
				{
					txtUtilidad.requestFocus();
				}
			}
		});
		txaFormulacion.setInputVerifier(new InputVerifier() {			
			@Override
			public boolean verify(JComponent arg0) {
				if ( txaFormulacion.getText().length() > 0)
				{
					return true;
				}
				else
				{
					JOptionPane.showOptionDialog (null,"Favor de Capturar la Formulacion","Datos Incorrectos",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
					txaFormulacion.requestFocus();
					return false;
				}
				
			}
		});
		txaFormulacion.setText("Formulación");
		txaFormulacion.setLineWrap(true);
		txaFormulacion.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
		scrollPane_1.setViewportView(txaFormulacion);
		table = new JTable();
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null, null, null},
				{null, null, null, null, null},
				{null, null, null, null, null},
				{null, null, null, null, null},
				{null, null, null, null, null},
			},
			new String[] {
				"Cod Reactivo", "Nombre", "Precio x kilo", "Nec. Gramos", "Costo"
			}
		) {
			Class[] columnTypes = new Class[] {
				Integer.class, String.class, Double.class, Integer.class, Double.class
			};
			public Class getColumnClass(int columnIndex) {
				return columnTypes[columnIndex];
			}
			boolean[] columnEditables = new boolean[] {
				false, false, false, false, false
			};
			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		table.getColumnModel().getColumn(0).setResizable(false);
		table.getColumnModel().getColumn(0).setPreferredWidth(85);
		table.getColumnModel().getColumn(1).setResizable(false);
		table.getColumnModel().getColumn(1).setPreferredWidth(220);
		table.getColumnModel().getColumn(2).setResizable(false);
		table.getColumnModel().getColumn(2).setPreferredWidth(85);
		table.getColumnModel().getColumn(3).setResizable(false);
		table.getColumnModel().getColumn(3).setPreferredWidth(85);
		table.getColumnModel().getColumn(4).setResizable(false);
		table.getColumnModel().getColumn(4).setPreferredWidth(85);
		scrollPane.setViewportView(table);
		contentPanel.setLayout(gl_contentPanel);
		contentPanel.setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{txtCodigo, txtUtilidad, txtExistencia, txtCodReactivo, txtPrecioKilo, txtDescripcion, txtStockMin, lblCodigo, lblStock, txtGramos, txtPrecioCostoProducto, txtPrecioVenta, lblDescripcion, lblUnidadM, lblExistencia, scrollPane, table, lblPrecioVenta, lblUtilidad, lblPrecioCostoProducto, lblCodReactivo, lblPrecioXKilo, lblNecGramos}));
		{
			buttonPane = new JPanel();
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				okButton = new JButton("OK");
				okButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent arg0) {
						guardar();
					}
				});
				buttonPane.setLayout(new CardLayout(0, 0));
				
				sbMensaje = new StatusBar();
				sbMensaje.setHorizontalAlignment(SwingConstants.CENTER);
				sbMensaje.setText("Preciona [ F5 ] para continuar");
				buttonPane.add(sbMensaje, "name_58423054101212");
				okButton.setActionCommand("OK");
				buttonPane.add(okButton, "name_58423094811953");
				getRootPane().setDefaultButton(okButton);
			}
			{
				cancelButton = new JButton("Cancel");
				cancelButton.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent arg0) {
						System.exit(EXIT_ON_CLOSE);
					}
				});
				cancelButton.setActionCommand("Cancel");
				buttonPane.add(cancelButton, "name_58423131863393");
				
			}
		}
		setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{txtCodigo, txtDescripcion, txtStockMin, txtExistencia, okButton, cancelButton, getContentPane(), contentPanel, lblStock, lblDescripcion, lblCodigo, lblExistencia, lblUnidadM, buttonPane}));
	}
	
	public boolean guardar()
	{
		boolean bResultado = true;
		
		int iCodigo = general.consultarFolio(comando, cNemonicos.FOLIO_PRODUCTOS, cNemonicos.INCREMENTAR_SECUENCIA);
		String sNombre = txtDescripcion.getText();
		int iUtilidad = Integer.parseInt(txtUtilidad.getText());
		int iStock = Integer.parseInt(txtStockMin.getText());
		int iExistencia = Integer.parseInt(txtExistencia.getText());
		String sCostoProducto = txtPrecioCostoProducto.getText();
		sCostoProducto = sCostoProducto.replace(",", ".");
		double dPrecioCostoProducto = Double.parseDouble(sCostoProducto);
		String sPrecioVenta = txtPrecioVenta.getText();
		sPrecioVenta = sPrecioVenta.replace(",", ".");
		double iPrecioVenta = Double.parseDouble(sPrecioVenta);
		String sFormulacion = txaFormulacion.getText();
		String query;
		query = String.format("select guardarproducto(" + iCodigo + ",'%s','%s', "+ iUtilidad + "," + iStock + "," + iExistencia + "," + dPrecioCostoProducto + "," + iPrecioVenta + ",'%s' )", sNombre, sUnidadMedida, sFormulacion );
		System.out.println(query);
	
		general.generarTransaccion(comando, "Begin");
		cTotal insertar = new cTotal(comando);
		try {
			insertar.ejecutar(query);
					
		for (int Ren = 0; Ren < iRenglon; Ren++) {
			int iCodReactivo = (int) table.getValueAt(Ren, COL_COD_REACTIVO);
			String sDescrip = (String) table.getValueAt(Ren, COL_DESCRIPCION);
			double dPrecioxKg = (double) table.getValueAt(Ren, COL_PRECIO_KILO);
			int iGramos = (int) table.getValueAt(Ren, COL_GRAMOS);
			String sCosto = String.valueOf(table.getValueAt(Ren, COL_COSTO));
			sCosto = sCosto.replace(",", ".");
			double dCosto = Double.parseDouble(sCosto);
			
			System.out.println("cod reactivo: " + iCodReactivo + " descrip " + sDescrip + " precio: " + dPrecioxKg + " gramos " + iGramos + " costo " + dCosto );
			query = String.format("select guardarproductoDetalle(" + iCodigo + "," + iCodReactivo + "," + dPrecioxKg + "," + iGramos + "," + dCosto + ");");
			System.out.println(query);
			insertar.ejecutar(query);
			
		}
		general.generarTransaccion(comando, "Commit");
		
		} catch (SQLException e) {
			general.generarTransaccion(comando, "Rollback");
			general.grabarError("frmProductos", "guardar", -1, query, e.getMessage(),"Error al insertar Producto");
			// TODO Auto-generated catch block
			bResultado = false;
			e.printStackTrace();
		}

		return bResultado;		
	}
	
	
	public boolean conslutar(int iCodigo)
	{
		boolean bResultado = false;
		
		
		try{
			
			//Una variable String para almacenar la sentencia SQL
			String query = "select codigo, TRIM(descripcion) as descripcion from productos where codigo = " + iCodigo + ";";
			
			ResultSet resultado = comando.executeQuery(query);
			

			//Ejecutamos la consulta SQL
			if (resultado.next()) {
				txtDescripcion.setText(resultado.getString("descripcion"));
				bResultado = true;
			}

			}
			catch( SQLException e )
			{
				//Por si ocurre un error
				System.out.println(e.getMessage());
				int op = JOptionPane.showOptionDialog (null,e.getMessage(),"Entrada Invalidad",JOptionPane.YES_OPTION,JOptionPane.ERROR_MESSAGE,null,new Object[] {"ACEPTAR"},"ACEPTAR");
				if (op == 0)
				{
					txtCodigo.requestFocus();
				}
			}
					
			
		return bResultado;		
	}
	
	public boolean conslutarReactivo(int iCodigo) {
		
		boolean bRespuesta = true;

		try {

			// Una variable String para almacenar la sentencia SQL
			String query = "select trim(descripcion) as descripcion,precioxkilo  from reactivos where codigo = "
					+ iCodigo + ";";

			ResultSet resultado = comando.executeQuery(query);

			// Ejecutamos la consulta SQL
			if (resultado.next()) {
				sDescripcion = resultado.getString("descripcion");
				txtPrecioKilo.setText(String.valueOf(resultado.getDouble("precioxkilo")));				
			}
			else
			{
				bRespuesta = false;
			}

		} catch (SQLException e) {
			bRespuesta = false;
			// Por si ocurre un error
			System.out.println(e.getMessage());
			int op = JOptionPane.showOptionDialog(null, e.getMessage(),
					"Entrada Invalidad", JOptionPane.YES_OPTION,
					JOptionPane.ERROR_MESSAGE, null,
					new Object[] { "ACEPTAR" }, "ACEPTAR");
			if (op == 0) {

			}
		}

		return bRespuesta;
	}
	
	public void changeLookAndFeel(String laf)
	{
		//si no se especifica tome la del sistema
		if (laf==null) {
			laf=UIManager.getSystemLookAndFeelClassName();
		}
		try {
			//cambiar el LAF
			try {
				UIManager.setLookAndFeel(laf);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		catch (UnsupportedLookAndFeelException e) {
			// handle exception
			e.printStackTrace();
		}
		SwingUtilities.updateComponentTreeUI(this);
	}
	public void limpiarCampos()
	{
		txtCodigo.setText("");
		txtDescripcion.setText("");
		cbUnidadMedida.setSelectedIndex(-1);
		txtExistencia.setText("");
		txtStockMin.setText("");
		txtPrecioCostoProducto.setText("");
		txtUtilidad.setText("");
		txtPrecioVenta.setText("");
		txaFormulacion.setText("");
		limpiarCamposReactivos();
		limpiarGrid();
		txtCodigo.requestFocus();
	}
	public void limpiarCamposReactivos()
	{
		txtCodReactivo.setText("");
		txtGramos.setText("");
		txtPrecioKilo.setText("");
	}
	
	public void limpiarGrid()
	{		
		for (int iRen = 0; iRen < table.getRowCount(); iRen++) {
			table.setValueAt(null,iRen, COL_COD_REACTIVO);
			table.setValueAt(null,iRen, COL_DESCRIPCION);
			table.setValueAt(null,iRen, COL_PRECIO_KILO);
			table.setValueAt(null,iRen, COL_GRAMOS);
			table.setValueAt(null,iRen, COL_COSTO);			
		}
		iRenglon = 0;
	}
	
	public double calcularCostoProducto()
	{
		double dTotal = 0;
		
		for (int Ren = 0; Ren <= iRenglon; Ren++) {
			
			dTotal += (double) table.getValueAt(Ren, COL_COSTO);
		}
		
		return dTotal;
	}
	
	public boolean consultarProducto(int iCodigo)
	{
		boolean bResultado = true;
		sDescripcion = "";
		try {

			// Una variable String para almacenar la sentencia SQL
			String query = "select trim(nombre) as nombre,unidadmedida,utilidad,stock,existencia,preciocostoproducto,precioventa,formulacion from productos where codigo = "
					+ iCodigo + ";";
			System.out.println(query);

			ResultSet resultado = comando.executeQuery(query);

			// Ejecutamos la consulta SQL
			if (resultado.next()) {
				sbMensaje.setText("[ SUPR ] Eliminar Producto");
				String sCodigo = txtCodigo.getText();
				limpiarCampos();
				txtCodigo.setText(sCodigo);
				txtDescripcion.setText(resultado.getString("nombre"));
				cbUnidadMedida.setSelectedItem(resultado.getString("unidadmedida"));
				txtUtilidad.setText(String.valueOf(resultado.getInt("utilidad")));
				txtStockMin.setText(String.valueOf(resultado.getInt("stock")));
				txtExistencia.setText(String.valueOf(resultado.getInt("existencia")));
				txtPrecioCostoProducto.setText(String.valueOf(resultado.getDouble("preciocostoproducto")));
				txtPrecioVenta.setText(String.valueOf(resultado.getDouble("precioventa")));
				txaFormulacion.setText(resultado.getString("formulacion"));
				consultarProductoDetalle(iCodigo);
			}
			else
			{
				sDescripcion = "";
				bResultado = false;
			}

		} catch (SQLException e) {
			bResultado = false;
			sDescripcion = "";
			// Por si ocurre un error
			System.out.println(e.getMessage());
			int op = JOptionPane.showOptionDialog(null, e.getMessage(),
					"Entrada Invalidad", JOptionPane.YES_OPTION,
					JOptionPane.ERROR_MESSAGE, null,
					new Object[] { "ACEPTAR" }, "ACEPTAR");
			if (op == 0) {

			}
		}

		return bResultado;
	}
	
	public boolean consultarProductoDetalle(int iCodigo)
	{
		boolean bResultado = false;
		int iRenglon = 0;
		try {

			// Una variable String para almacenar la sentencia SQL
			String query = "select codigoreactivo,trim(descripcion) as descripcion,preciokilo,nececidadgramos,costo from productosdetalle as a inner join reactivos as b on a.codigoreactivo = b.codigo where a.codigo = "
					+ iCodigo + ";";
			System.out.println(query);

			ResultSet resultado = comando.executeQuery(query);

			// Ejecutamos la consulta SQL
			while (resultado.next()) {
				
				table.setValueAt(String.valueOf(resultado.getInt("codigoreactivo")), iRenglon, COL_COD_REACTIVO);
				table.setValueAt(resultado.getString("descripcion"), iRenglon, COL_DESCRIPCION);
				table.setValueAt(resultado.getDouble("preciokilo"), iRenglon, COL_PRECIO_KILO);
				table.setValueAt(resultado.getInt("nececidadgramos"), iRenglon, COL_GRAMOS);
				table.setValueAt(resultado.getDouble("costo"), iRenglon, COL_COSTO);
				
				iRenglon++;
			}

		} catch (SQLException e) {
			sDescripcion = "";
			// Por si ocurre un error
			System.out.println(e.getMessage());
			int op = JOptionPane.showOptionDialog(null, e.getMessage(),
					"Entrada Invalidad", JOptionPane.YES_OPTION,
					JOptionPane.ERROR_MESSAGE, null,
					new Object[] { "ACEPTAR" }, "ACEPTAR");
			if (op == 0) {

			}
		}

		return bResultado;
	}
	
	public boolean eliminarProducto(int iCodigo)
	{
		boolean bResultado = false;
		int iRenglon = 0;
		try {

			// Una variable String para almacenar la sentencia SQL
			String query = "delete from productos where codigo = " + iCodigo + " ; delete from productosdetalle  where codigo = " + iCodigo + ";";
			System.out.println(query);

			//Ejecutamos la consulta SQL
			comando.executeUpdate(query);
			//sbMensaje.setText("Producto Eliminado Con Exito");
			limpiarCampos();
			

		} catch (SQLException e) {
			sDescripcion = "";
			// Por si ocurre un error
			System.out.println(e.getMessage());
			int op = JOptionPane.showOptionDialog(null, e.getMessage(),
					"Entrada Invalidad", JOptionPane.YES_OPTION,
					JOptionPane.ERROR_MESSAGE, null,
					new Object[] { "ACEPTAR" }, "ACEPTAR");
			if (op == 0) {

			}
		}

		return bResultado;
	}
}

